Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / frontend / NomadRichHtmlLinks.test.js

Displaying Raw • Download


tests/frontend/NomadRichHtmlLinks.test.js 0ae5f2bda55128261e22725815ffa67aa5b924fa (0ae5f2bd) Text, 5.00 KB

Tff7b72import Tb4b4b4{ Te6edf3describeTb4b4b4, Te6edf3itTb4b4b4, Te6edf3expectTb4b4b4, Te6edf3viTb4b4b4, Te6edf3beforeEachTb4b4b4, Te6edf3afterEach Tb4b4b4} Tff7b72from Ta5d6ff"vitest"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3handleRichHtmlLinkClickTb4b4b4, Te6edf3openExternalHttpUrl Tb4b4b4} Tff7b72from Ta5d6ff"@/js/NomadRichHtmlLinks.js"Tb4b4b4;

Tff7b72function Te6edf3clickEventTb4b4b4(Te6edf3targetTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3ev Tff7b72= Tff7b72new Te6edf3MouseEventTb4b4b4(Ta5d6ff"click"Tb4b4b4, Tb4b4b4{ Te6edf3bubblesTff7b72: Tff7b72trueTb4b4b4, Te6edf3cancelableTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tffa657ObjectTb4b4b4.Te6edf3definePropertyTb4b4b4(Te6edf3evTb4b4b4, Ta5d6ff"target"Tb4b4b4, Tb4b4b4{ Te6edf3valueTff7b72: Te6edf3target Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3evTb4b4b4;
Tb4b4b4}

Te6edf3describeTb4b4b4(Ta5d6ff"NomadRichHtmlLinks"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3describeTb4b4b4(Ta5d6ff"openExternalHttpUrl"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"opens http(s) in a new window"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3opener Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3openExternalHttpUrlTb4b4b4(Ta5d6ff"https://example.com"Tb4b4b4, Te6edf3openerTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3openerTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Ta5d6ff"https://example.com"Tb4b4b4, Ta5d6ff"_blank"Tb4b4b4, Ta5d6ff"noopener,noreferrer"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"ignores empty urls"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3opener Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3openExternalHttpUrlTb4b4b4(Ta5d6ff""Tb4b4b4, Te6edf3openerTb4b4b4)Tb4b4b4;
Te6edf3openExternalHttpUrlTb4b4b4(Tff7b72nullTb4b4b4, Te6edf3openerTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3openerTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toHaveBeenCalledTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3describeTb4b4b4(Ta5d6ff"handleRichHtmlLinkClick"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72let Te6edf3holderTb4b4b4;

Te6edf3beforeEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3holder Tff7b72= Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"div"Tb4b4b4)Tb4b4b4;
Tffa657documentTb4b4b4.Te6edf3bodyTb4b4b4.Te6edf3appendChildTb4b4b4(Te6edf3holderTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3afterEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tffa657documentTb4b4b4.Te6edf3bodyTb4b4b4.Te6edf3removeChildTb4b4b4(Te6edf3holderTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"routes nomadnet links through onNomadUrl"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3holderTb4b4b4.Te6edf3innerHTML Tff7b72= Ta5d6ff'<a class="nomadnet-link" data-nomadnet-url="abc123:/page/index.mu">n</a>'Tb4b4b4;
Tff7b72const Te6edf3onNomadUrl Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3ev Tff7b72= Te6edf3clickEventTb4b4b4(Te6edf3holderTb4b4b4.Te6edf3querySelectorTb4b4b4(Ta5d6ff"a"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3handleRichHtmlLinkClickTb4b4b4(Te6edf3evTb4b4b4, Tb4b4b4{ Te6edf3onNomadUrl Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3onNomadUrlTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Ta5d6ff"abc123:/page/index.mu"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3evTb4b4b4.Te6edf3defaultPreventedTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"opens http links externally"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3holderTb4b4b4.Te6edf3innerHTML Tff7b72= Ta5d6ff'<a href="https://example.com">x</a>'Tb4b4b4;
Tff7b72const Te6edf3openExternalHttp Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3ev Tff7b72= Te6edf3clickEventTb4b4b4(Te6edf3holderTb4b4b4.Te6edf3querySelectorTb4b4b4(Ta5d6ff"a"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3handleRichHtmlLinkClickTb4b4b4(Te6edf3evTb4b4b4, Tb4b4b4{ Te6edf3openExternalHttp Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3openExternalHttpTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Ta5d6ff"https://example.com/"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3evTb4b4b4.Te6edf3defaultPreventedTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"scrolls fragment anchors within scrollRoot"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3holderTb4b4b4.Te6edf3innerHTML Tff7b72= Ta5d6ff'<div id="target">t</div><a href="#target">f</a>'Tb4b4b4;
Tff7b72const Te6edf3target Tff7b72= Te6edf3holderTb4b4b4.Te6edf3querySelectorTb4b4b4(Ta5d6ff"#target"Tb4b4b4)Tb4b4b4;
Te6edf3targetTb4b4b4.Te6edf3scrollIntoView Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3ev Tff7b72= Te6edf3clickEventTb4b4b4(Te6edf3holderTb4b4b4.Te6edf3querySelectorTb4b4b4(Ta5d6ff"a"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3handleRichHtmlLinkClickTb4b4b4(Te6edf3evTb4b4b4, Tb4b4b4{ Te6edf3scrollRootTff7b72: Te6edf3holder Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3targetTb4b4b4.Te6edf3scrollIntoViewTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3evTb4b4b4.Te6edf3defaultPreventedTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"blocks unhandled anchor navigation by default"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3holderTb4b4b4.Te6edf3innerHTML Tff7b72= Ta5d6ff'<a href="javascript:alert(1)">bad</a>'Tb4b4b4;
Tff7b72const Te6edf3openExternalHttp Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3ev Tff7b72= Te6edf3clickEventTb4b4b4(Te6edf3holderTb4b4b4.Te6edf3querySelectorTb4b4b4(Ta5d6ff"a"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3handleRichHtmlLinkClickTb4b4b4(Te6edf3evTb4b4b4, Tb4b4b4{ Te6edf3openExternalHttp Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3evTb4b4b4.Te6edf3defaultPreventedTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3openExternalHttpTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toHaveBeenCalledTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"routes lxmf links through onLxmfAddress for valid 32-char hex"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3hash Tff7b72= Ta5d6ff"a"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4;
Te6edf3holderTb4b4b4.Te6edf3innerHTML Tff7b72= Ta5d6ff`Ta5d6ff<a class="lxmf-link" data-lxmf-address="Tffd700${Te6edf3hashTffd700}Ta5d6ff">lx</a>Ta5d6ff`Tb4b4b4;
Tff7b72const Te6edf3onLxmfAddress Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3ev Tff7b72= Te6edf3clickEventTb4b4b4(Te6edf3holderTb4b4b4.Te6edf3querySelectorTb4b4b4(Ta5d6ff"a"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3handleRichHtmlLinkClickTb4b4b4(Te6edf3evTb4b4b4, Tb4b4b4{ Te6edf3onLxmfAddress Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3onLxmfAddressTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Te6edf3hashTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3evTb4b4b4.Te6edf3defaultPreventedTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"rejects invalid lxmf addresses"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3holderTb4b4b4.Te6edf3innerHTML Tff7b72= Ta5d6ff'<a class="lxmf-link" data-lxmf-address="not-a-valid-hash">lx</a>'Tb4b4b4;
Tff7b72const Te6edf3onLxmfAddress Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3ev Tff7b72= Te6edf3clickEventTb4b4b4(Te6edf3holderTb4b4b4.Te6edf3querySelectorTb4b4b4(Ta5d6ff"a"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3handleRichHtmlLinkClickTb4b4b4(Te6edf3evTb4b4b4, Tb4b4b4{ Te6edf3onLxmfAddress Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3onLxmfAddressTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toHaveBeenCalledTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3evTb4b4b4.Te6edf3defaultPreventedTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"routes openNode actions through onOpenNode"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3holderTb4b4b4.Te6edf3innerHTML Tff7b72= Ta5d6ff'<span data-action="openNode" data-destination="deadbeef:/page/x.mu">go</span>'Tb4b4b4;
Tff7b72const Te6edf3onOpenNode Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3ev Tff7b72= Te6edf3clickEventTb4b4b4(Te6edf3holderTb4b4b4.Te6edf3querySelectorTb4b4b4(Ta5d6ff"[data-action=openNode]"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3handleRichHtmlLinkClickTb4b4b4(Te6edf3evTb4b4b4, Tb4b4b4{ Te6edf3onOpenNode Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3onOpenNodeTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Ta5d6ff"deadbeef:/page/x.mu"Tb4b4b4, Tff7b72nullTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3evTb4b4b4.Te6edf3defaultPreventedTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"returns false for unrelated clicks"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3holderTb4b4b4.Te6edf3innerHTML Tff7b72= Ta5d6ff"<span>plain text</span>"Tb4b4b4;
Tff7b72const Te6edf3ev Tff7b72= Te6edf3clickEventTb4b4b4(Te6edf3holderTb4b4b4.Te6edf3querySelectorTb4b4b4(Ta5d6ff"span"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3handleRichHtmlLinkClickTb4b4b4(Te6edf3evTb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3evTb4b4b4.Te6edf3defaultPreventedTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────